/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.quickorm.core;

import java.util.List;
import java.util.Map;
import javax.sql.DataSource;

/**
 *
 * @author aaa
 */
public interface QuickormTemplate {

    /**
     * 得到数据源
     *
     * @return
     */
    public DataSource getDataSource();

    /**
     * 根据ID得到实体
     *
     * @param <T>
     * @param entityClass
     * @param id
     * @return
     */
    public <T> T get(Class<T> entityClass, Object id);

    /**
     * 保存实体对象
     *
     * @param t 实体对象
     * @return
     */
    public void save(Object t);

    /**
     * 批量保存
     *
     * @param tList
     */
    public void saveBatch(List<Object> tList);

    /**
     * 更新实体数据
     *
     * @param t 实体对象
     * @return
     */
    public void update(Object t);

    /**
     * 根据主键ID删除数据
     *
     * @param id 主键ID
     * @return
     */
    public void delete(Class entityClass, Object id);

    /**
     * 根据主键列表删除一批数据
     *
     * @param idList
     * @return
     */
    public void deleteList(Class entityClass, List<Object> idList);

    //得到所有实体列表
    public <T> List<T> getList(Class<T> entityClass);

    /**
     * 得到指定条件的实体列表(不分页)
     *
     * @param conditionArgumentMap 条件及对应参数Map
     * @return
     */
    public <T> List<T> getList(Class<T> entityClass, Map<String, Object> conditionArgumentMap);

    /**
     * 得到指定条件的实体列表(不分页)
     *
     * @param conditionArgumentMap 条件及对应参数Map
     * @param sqlSuffix SQL后缀
     * @return
     */
    public <T> List<T> getList(Class<T> entityClass, Map<String, Object> conditionArgumentMap, String sqlSuffix);

    /**
     * 得到指定条件和指定页的实体列表(带分页)
     *
     * @param conditionArgumentMap 条件及对应参数Map
     * @param pageIndex 页码(从第1页开始)
     * @param pageSize 页大小
     * @return
     */
    public <T> PagedList<T> getList(Class<T> entityClass, Map<String, Object> conditionArgumentMap, int pageIndex, int pageSize);

    /**
     * 得到指定条件和指定页的实体列表(带分页)
     *
     * @param conditionArgumentMap 条件及对应参数Map
     * @param sqlSuffix SQL后缀
     * @param pageIndex 页码(从第1页开始)
     * @param pageSize 页大小
     * @return
     */
    public <T> PagedList<T> getList(Class<T> entityClass, Map<String, Object> conditionArgumentMap, String sqlSuffix, int pageIndex, int pageSize);

    /**
     * 执行查询
     *
     * @param sql 查询SQL语句
     * @param clazz 映射的类
     * @param argumentArray 参数数组
     * @return
     */
    public <T> List<T> executeQuery(String sql, Class<T> clazz, Object... argumentArray);

    /**
     * 执行查询
     *
     * @param sql 查询SQL语句
     * @param argumentList 参数列表
     * @param conditionArguemntMap 条件及对应参数Map
     * @param clazz 映射的类
     * @return
     */
    public <T> List<T> executeQuery(String sql, List<Object> argumentList, Map<String, Object> conditionArguemntMap, Class<T> clazz);

    /**
     * 执行查询
     *
     * @param sql 查询SQL语句
     * @param argumentList 参数列表
     * @param conditionArguemntMap 条件及对应参数Map
     * @param sqlSuffix SQL后缀
     * @param clazz 映射的类
     * @return
     */
    public <T> List<T> executeQuery(String sql, List<Object> argumentList, Map<String, Object> conditionArguemntMap, String sqlSuffix, Class<T> clazz);

    /**
     * 执行带分页的查询
     *
     * @param sql 查询SQL语句
     * @param clazz 映射的类
     * @param pageIndex 页码(从第1页开始)
     * @param pageSize 页大小
     * @param argumentArray 参数数组
     * @return
     */
    public <T> PagedList<T> executePagedQuery(String sql, Class<T> clazz, int pageIndex, int pageSize, Object... argumentArray);

    /**
     * 执行带分页的查询
     *
     * @param sql 查询SQL语句
     * @param argumentList 参数列表
     * @param conditionArguemntMap 条件及对应参数Map
     * @param clazz 映射的类
     * @param pageIndex 页码(从第1页开始)
     * @param pageSize 页大小
     * @return
     */
    public <T> PagedList<T> executePagedQuery(String sql, List<Object> argumentList, Map<String, Object> conditionArguemntMap, Class<T> clazz, int pageIndex, int pageSize);

    /**
     * 执行带分页的查询
     *
     * @param sql 查询SQL语句
     * @param argumentList 参数列表
     * @param conditionArguemntMap 条件及对应参数Map
     * @param sqlSuffix SQL后缀
     * @param clazz 映射的类
     * @param pageIndex 页码(从第1页开始)
     * @param pageSize 页大小
     * @return
     */
    public <T> PagedList<T> executePagedQuery(String sql, List<Object> argumentList, Map<String, Object> conditionArguemntMap, String sqlSuffix, Class<T> clazz, int pageIndex, int pageSize);

    /**
     * 执行更改
     *
     * @param sql 更改SQL语句
     * @param argumentArray 参数列表
     * @return
     */
    public int executeUpdate(String sql, Object... argumentArray);

    /**
     * 执行更改
     *
     * @param sql 更改SQL语句
     * @param argumentList 参数列表
     * @param conditionArguemntMap 条件列表
     * @return
     */
    public int executeUpdate(String sql, List<Object> argumentList, Map<String, Object> conditionArguemntMap);

    /**
     * 执行批量更改
     *
     * @param sql 更改语句
     * @param argumentListList 参数列表列表
     * @return
     * @throws SQLException
     */
    public int[] executeBatchUpdate(String sql, List<List<Object>> argumentListList);
}
